home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume6 / glib / part08 < prev    next >
Encoding:
Text File  |  1989-05-14  |  50.6 KB  |  2,133 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i109: glib part 8 of 15
  4. Reply-To: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee )
  5.  
  6. Posting-number: Volume 6, Issue 109
  7. Submitted-by: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee )
  8. Archive-name: glib/part08
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 8 (of 15)."
  17. # Contents:  dep5.mnu mac-mdr.a tx81p.mnu
  18. # Wrapped by lee@uhccux on Sun May  7 00:40:15 1989
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. if test -f 'dep5.mnu' -a "${1}" != "-c" ; then 
  21.   echo shar: Will not clobber existing file \"'dep5.mnu'\"
  22. else
  23. echo shar: Extracting \"'dep5.mnu'\" \(18882 characters\)
  24. sed "s/^X//" >'dep5.mnu' <<'END_OF_FILE'
  25. X/* $Id: dep5.mnu,v 1.6 89/05/06 17:13:20 lee Exp $
  26. X * GLIB - a Generic LIBrarian and editor for synths
  27. X *
  28. X * DEP-5 routines.
  29. X * Tim Thompson
  30. X *
  31. X * The DEP-5 is a mess, the code below is likewise.  There are only 12
  32. X * parameters or so, but there are 11 algorithms, and different parameters
  33. X * have different meanings and ranges in each algorithm.  Also, the displayed
  34. X * values have NO regular relationship to the byte values of the parameters,
  35. X * hence the need for all the huge tables.
  36. X *
  37. X * modifications: Greg Lee
  38. X * $Log:    dep5.mnu,v $
  39. X * Revision 1.6  89/05/06  17:13:20  lee
  40. X * rel. to comp.sources.misc
  41. X * 
  42. X * 
  43. X */
  44. X
  45. X#define OVERLAY2
  46. X
  47. X#include "glib.h"
  48. X#include <ctype.h>
  49. X
  50. X#define DEP5VSIZE 42
  51. X#define DEP5NSIZE 16
  52. X#define DEP5NVOICES 99
  53. X#define RESERVESIZE 0
  54. X
  55. Xchar D5buff[16];
  56. Xint Alg;    /* current algorithm, 0-10 */
  57. X
  58. Xchar *visnum(), *visonoff(), *vism3num(), *viswave(), *vismono();
  59. Xchar *visd5alg(), *visdcr(), *visdcd(), *visdcf(), *visdrs(), *visd5pd();
  60. Xchar *visd5rt(), *visd5hf(), *visd5no(), *visd5q(), *visd5fm(), *visd5bc();
  61. X
  62. Xstruct numpair {
  63. X    int np_byte;
  64. X    int np_val;
  65. X};
  66. X
  67. Xstruct hfpair {
  68. X    short hf_byte;
  69. X    short hf_val;
  70. X};
  71. X
  72. X
  73. X#define NUMHF 96
  74. X#define NUMCD 223
  75. X#define NUMFREQ 128
  76. X#define NUMGATE 256
  77. X#define NUMCF 256
  78. X#define NUMCR 97
  79. X#define NUMNLRT 151
  80. X#define NUMRT 153
  81. X#define NUMDT 256
  82. X#define NUMPD 256
  83. Xstruct numpair *Revtime;
  84. Xstruct numpair *Nlrevtime;
  85. Xstruct hfpair *Hf;
  86. Xstruct numpair *Chdepth;
  87. Xstruct numpair *Chrate;
  88. Xint *Predly;
  89. Xint *Chfeed;
  90. Xint *Dtime;
  91. Xint *Freqmid;
  92. Xint *Gatetime;
  93. X
  94. X/* This array contains arbitrary screen labels */
  95. Xstruct labelinfo Ldep5[] = {
  96. X#MENU
  97. X
  98. X
  99. X                 Algorithm %
  100. X                 ===========
  101. X
  102. X<Equalizer>                       <Chorus>
  103. X   Output Level        %                 Feedback of Chorus   %
  104. X   Boost/Cut of Low    %                 Rate of Chorus       %
  105. X   Boost/Cut of Mid    %                 Depth of Chorus      %
  106. X   Boost/Cut of High   %          <Reverb>
  107. X   Q of Mid            %                 Pre-Delay            %
  108. X   Freq (KHz) of Mid   %                 Reverb Time          %
  109. X                                         HF Damping           %
  110. X-------------------------+               Reverb Selection     %
  111. XN - set name  q - quit   |        <Non-Linear>
  112. Xh - left      j - down   |
  113. Xk - up        l - right  |
  114. XJ - decr      K - incr   |
  115. Xspace = play auto-note   |
  116. X                         |        <Delay>
  117. XAuto-Note:               |
  118. X   Pitch %    Vol  %     |
  119. X   Dur   %    Chan %     |
  120. X                         |
  121. X#END
  122. X-1,-1,NULL
  123. X};
  124. X
  125. Xstruct paraminfo  Pdep5[] =  {
  126. X/*
  127. XNAME        TYPE        POS    MAX    OFFSET    MASK    SHIFT    ADHOC
  128. X */
  129. X#O algorithm    d5alg    %%    10    0
  130. X#O chorfeed    dcf    %%    255    0
  131. X#O outlev    num    %%    99    1
  132. X#O chorrate    dcr    %%    96    0
  133. X#O lowfilt    d5bc    %%    24    0
  134. X#O chordepth    dcd    %%    222    0
  135. X#O midfilt    d5bc    %%    24    0
  136. X#O highfilt    d5bc    %%    24    0
  137. X#O predelay    d5pd    %%    255    0
  138. X#O q        d5q    %%    90    2
  139. X#O reverbtime    d5rt    %%    152    0
  140. X#O freqmid    d5fm    %%    127    3
  141. X#O hfdamp    d5hf    %%    95    0
  142. X#O reverbsel    drs    %%    21    0
  143. X#O autovol    num    %%    127    -63
  144. X#O autopitch    num    %%    127    -60
  145. X#O autochan    num    %%    16    -1    *5
  146. X#O autodur    num    %%    20    -5    *5
  147. XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0
  148. X};
  149. X
  150. X
  151. X/*
  152. X * dep5din
  153. X *
  154. X * Take info from 'data' and stuff values in the P array, by using
  155. X * the setval functionms.
  156. X */
  157. X
  158. Xdep5din(data)
  159. Xchar *data;
  160. X{
  161. X    initdp5();
  162. X
  163. X    Alg = d5algin(data[16] | ((data[17]&0xf)<<4));
  164. X    setval("algorithm", Alg);
  165. X
  166. X    setval("reverbsel",data[0]);
  167. X    setval("outlev",data[1]);
  168. X    setval("q",data[2]);
  169. X    setval("freqmid",data[3]);
  170. X    /* these parameters take up 2 bytes (4bits in each) */
  171. X    setval("lowfilt", d5bcin(data[4] | ((data[5]&0xf)<<4)) );
  172. X    setval("midfilt", d5bcin(data[6] | ((data[7]&0xf)<<4)) );
  173. X    setval("highfilt", d5bcin(data[8] | ((data[9]&0xf)<<4)) );
  174. X    setval("chorfeed", data[10] | ((data[11]&0xf)<<4) );
  175. X    setval("chorrate",d5vin(Chrate,data[12] | ((data[13]&0xf)<<4)));
  176. X    setval("chordepth",d5vin(Chdepth,data[14] | ((data[15]&0xf)<<4)));
  177. X    setval("predelay", data[18] | ((data[19]&0xf)<<4) );
  178. X    setval("reverbtime", d5rtin(data[20] | ((data[21]&0xf)<<4)) );
  179. X    setval("hfdamp", d5hfin(data[22] | ((data[23]&0xf)<<4)) );
  180. X
  181. X    setval("autochan",Channel);
  182. X
  183. X}
  184. X
  185. X/*
  186. X * dep5dout
  187. X *
  188. X * Take (possibly changed) parameters values out of the P array and
  189. X * put them back into 'data'.
  190. X */
  191. X
  192. Xdep5dout(data)
  193. Xchar *data;
  194. X{
  195. X    int n, alg;
  196. X
  197. X    alg = d5algout(getval("algorithm"));
  198. X    data[16] = alg & 0xf;
  199. X    data[17] = (alg >> 4) & 0xf;
  200. X
  201. X    data[0] = getval("reverbsel");
  202. X    data[1] = getval("outlev");
  203. X    data[2] = getval("q");
  204. X    data[3] = getval("freqmid");
  205. X
  206. X    /* these parameters take up 2 bytes (4bits in each) */
  207. X    n = d5bcout(getval("lowfilt"));
  208. X    data[4] = n & 0xf;
  209. X    data[5] = (n >> 4) & 0xf;
  210. X    n = d5bcout(getval("midfilt"));
  211. X    data[6] = n & 0xf;
  212. X    data[7] = (n >> 4) & 0xf;
  213. X    n = d5bcout(getval("highfilt"));
  214. X    data[8] = n & 0xf;
  215. X    data[9] = (n >> 4) & 0xf;
  216. X    n = getval("chorfeed");
  217. X    data[10] = n & 0xf;
  218. X    data[11] = (n >> 4) & 0xf;
  219. X    n = d5crout(getval("chorrate"));
  220. X    data[12] = n & 0xf;
  221. X    data[13] = (n >> 4) & 0xf;
  222. X    n = d5cdout(getval("chordepth"));
  223. X    data[14] = n & 0xf;
  224. X    data[15] = (n >> 4) & 0xf;
  225. X    n = getval("predelay");
  226. X    data[18] = n & 0xf;
  227. X    data[19] = (n >> 4) & 0xf;
  228. X    n = d5rtout(getval("reverbtime"));
  229. X    data[20] = n & 0xf;
  230. X    data[21] = (n >> 4) & 0xf;
  231. X    n = d5hfout(getval("hfdamp"));
  232. X    data[22] = n & 0xf;
  233. X    data[23] = (n >> 4) & 0xf;
  234. X
  235. X    Channel = getval("autochan");
  236. X}
  237. X
  238. X/*
  239. X * dep5sedit
  240. X *
  241. X * Send a single voice to the edit buffer of the dep5.
  242. X */
  243. Xdep5sedit(data)
  244. Xchar *data;
  245. X{
  246. X    dep5parms(data);
  247. X}
  248. X
  249. Xdep5parms(data)
  250. Xchar *data;
  251. X{
  252. X    int n;
  253. X
  254. X    sendmidi(0xf0);
  255. X    sendmidi(0x41);        /* Roland */
  256. X    sendmidi(0x35);        /* operation code = APR (all parameters) */
  257. X    sendmidi(Channel-1);    /* MIDI channel */
  258. X    sendmidi(0x52);        /* format type */
  259. X    sendmidi(0x20);        /* level # = 1 */
  260. X    sendmidi(0x01);        /* group # = 1 */
  261. X    /* send 24 bytes of parameter info */
  262. X    for ( n=0; n<24; n++ ) {
  263. X        sendmidi((int)(data[n]));
  264. X    }
  265. X    sendmidi(EOX);
  266. X}
  267. X
  268. X/* dep5nof - return a pointer to the voice name buried in data */
  269. Xchar *
  270. Xdep5nof(data)
  271. Xchar *data;
  272. X{
  273. X    static char currbuff[DEP5NSIZE+1];
  274. X    char *p;
  275. X    int m;
  276. X
  277. X    p = currbuff;
  278. X    for ( m=0; m<DEP5NSIZE; m++ )
  279. X        *p++ = data[24+m];
  280. X    *p = '\0';
  281. X    return(currbuff);
  282. X}
  283. X
  284. X/* setnameof - set the voice name buried in data to name */
  285. Xdep5snof(data,name)
  286. Xchar *data;
  287. Xchar *name;
  288. X{
  289. X    char *p;
  290. X    int m;
  291. X
  292. X    for ( p=name,m=0; *p!='\0' && m<DEP5NSIZE; p++,m++ )
  293. X        data[24+m] = *p;
  294. X    for ( ; m<DEP5NSIZE; m++ )
  295. X        data[24+m] = '\0';
  296. X}
  297. X
  298. X/* dep5sone - send and store one voice */
  299. Xdep5sone(voicenum,data)
  300. Xchar *data;
  301. X{
  302. X    /* Send the parameters for this voice. */
  303. X    dep5parms(data);
  304. X
  305. X    /* now ask it to be stored into memory */
  306. X    sendmidi(0xf0);
  307. X    sendmidi(0x41);        /* Roland */
  308. X    sendmidi(0x34);        /* operation code = PGR (program #) */
  309. X    sendmidi(Channel-1);    /* MIDI channel */
  310. X    sendmidi(0x52);        /* format type */
  311. X    sendmidi(0x20);        /* level # = 1 */
  312. X    sendmidi(0x00);        /* group # = 0 */
  313. X    sendmidi(0x00);        /* extension = 0 */
  314. X    sendmidi(voicenum & 0x7f);    /* memory number (minus 1) */
  315. X    sendmidi(0x02);        /* writing data to memory */
  316. X    sendmidi(EOX);
  317. X    
  318. X    Reason = "";
  319. X    return(0);    /* can't fail */
  320. X}
  321. X
  322. Xchar *D5alg[] = {
  323. X"1    ---EQ---Chorus---<~u/----~d~d~l~l~l~l~l\\----",
  324. X"2    ---EQ---Reverb---<~u/----~d~d~l~l~l~l~l\\----",
  325. X"3    ---EQ---Reverb(Mod)---<~u/----~d~d~l~l~l~l~l\\----",
  326. X"4    ---EQ---Reverb(Mod)---Chorus---<~u/----~d~d~l~l~l~l~l\\----",
  327. X"5    ---EQ-+-Reverb--<   +-Chorus---<~u/~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l\
  328. X/~u/--------------+---~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~d~d~d~\
  329. Xl~l~l~l~l~l~l~l~l|__________\\__|~l~l~l~d\\--------------~l~u\\~d+---",
  330. X"6    ---EQ---Reverb--<--Chorus---<~u/~l~l~l~l~l~l~l~l~l~l~l~l~l\
  331. X/~u/-----------+---~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~d~d~d~\
  332. Xl\\~d\\-----------~l~u\\~d+---",
  333. X"7    ---EQ---NLR---<~u/----~d~d~l~l~l~l~l\\----",
  334. X"8    ---EQ---NLR(Mod)---<~u/----~d~d~l~l~l~l~l\\----",
  335. X"9    ---EQ---NLR--<--Chorus---<~u/~l~l~l~l~l~l~l~l~l~l~l~l~l\
  336. X/~u/-----------+---~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~d~d~d~\
  337. Xl\\~d\\-----------~l~u\\~d+---",
  338. X"10   ---EQ---Delay--<--Chorus---<~u/~l~l~l~l~l~l~l~l~l~l~l~l~l\
  339. X/~u/-----------+---~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~d~d~d~\
  340. Xl\\~d\\-----------~l~u\\~d+---",
  341. X"11   ---EQ---NLR(Mod)---<~u/----~d~d~l~l~l~l~l\\----",
  342. X};
  343. X
  344. X#define NPARM 12
  345. Xchar Algparms[][NPARM] = {
  346. X1,1,1,0,0,0,0,1,1,1,1,1,    /* alg 1 */
  347. X0,0,0,1,1,1,1,1,1,1,1,1,    /* alg 2 */
  348. X0,1,1,1,1,1,1,1,1,1,1,1,    /* alg 3 */
  349. X1,1,1,1,1,1,1,1,1,1,1,1,    /* alg 4 */
  350. X1,1,1,1,1,1,1,1,1,1,1,1,    /* alg 5 */
  351. X1,1,1,1,1,1,1,1,1,1,1,1,    /* alg 6 */
  352. X0,0,0,1,1,1,1,1,1,1,1,1,    /* alg 7 */
  353. X0,1,1,1,1,1,1,1,1,1,1,1,    /* alg 8 */
  354. X1,1,1,1,1,1,1,1,1,1,1,1,    /* alg 9 */
  355. X1,1,1,1,1,1,1,1,1,1,1,1,    /* alg 10 */
  356. X0,1,1,1,1,1,1,1,1,1,1,1        /* alg 11 */
  357. X};
  358. X/* for the parameters in the array above, Algmap gives the index in P */
  359. Xint Algmap[] = {1,2,3,4,5,6,7,8,9,10,11,12};
  360. X
  361. X/*
  362. X * visd5alg
  363. X *
  364. X * Whenever the algorithm is changed, we have to change the
  365. X * meanings/locations/ranges of various parameters.
  366. X */
  367. X
  368. Xchar *
  369. Xvisd5alg(v)
  370. X{
  371. X    static int rt = -1, pd, hf, rs;
  372. X    int n;
  373. X
  374. X    if ( rt == -1 ) {
  375. X        pd = parmindex("predelay");
  376. X        hf = parmindex("hfdamp");
  377. X        rt = parmindex("reverbtime");
  378. X        rs = parmindex("reverbsel");
  379. X    }
  380. X    if ( v >= 0 && v <= 10 ){
  381. X        Alg = v;
  382. X        /* Enable the parameters that this algorithm uses */
  383. X        for ( n=0; n<NPARM; n++ ) {
  384. X            if ( Algparms[v][n] == 1 )
  385. X                enableparm(Algmap[n]);
  386. X            else
  387. X                disableparm(Algmap[n]);
  388. X        }
  389. X        if ( v == 9 ) {
  390. X            P[pd].p_vrow=P[pd].p_lrow=20;
  391. X            P[pd].p_label = "Delay Time";
  392. X
  393. X            P[rt].p_vrow=P[rt].p_lrow=21;
  394. X            P[rt].p_label = "Delay Feedback";
  395. X            P[rt].p_max = 255;
  396. X
  397. X            P[hf].p_vrow=P[hf].p_lrow=22;
  398. X            P[hf].p_label = "HF Damp";
  399. X            P[hf].p_max = 95;
  400. X
  401. X            P[rs].p_vrow=P[rs].p_lrow=23;
  402. X            P[rs].p_label = "Delay Output";
  403. X            P[rs].p_max = 2;
  404. X        }
  405. X        else if ( v<6 ) {
  406. X            P[pd].p_vrow=P[pd].p_lrow=10;
  407. X            P[pd].p_label = "Pre-Delay";
  408. X
  409. X            P[rt].p_vrow=P[rt].p_lrow=11;
  410. X            P[rt].p_label = "Reverb Time";
  411. X            P[rt].p_max = 152;
  412. X
  413. X            P[hf].p_vrow=P[hf].p_lrow=12;
  414. X            P[hf].p_label = "HF Damp";
  415. X            P[hf].p_max = 95;
  416. X
  417. X            P[rs].p_vrow=P[rs].p_lrow=13;
  418. X            P[rs].p_label = "Reverb Selection";
  419. X            P[rs].p_max = 21;
  420. X        }
  421. X        else {
  422. X            P[pd].p_vrow=P[pd].p_lrow=15;
  423. X            P[pd].p_label = "NL Pre-Delay";
  424. X
  425. X            P[rt].p_vrow=P[rt].p_lrow=16;
  426. X            P[rt].p_label = "NL Reverb Time";
  427. X            P[rt].p_max = 150;
  428. X
  429. X            P[hf].p_vrow=P[hf].p_lrow=17;
  430. X            P[hf].p_label = "NL Gate Time";
  431. X            P[hf].p_max = 255;
  432. X
  433. X            P[rs].p_vrow=P[rs].p_lrow=18;
  434. X            P[rs].p_label = "NL Output";
  435. X            P[rs].p_max = 2;
  436. X        }
  437. X        Redraw = 1;
  438. X        return(D5alg[v]);
  439. X    }
  440. X    else
  441. X        return("????");
  442. X}
  443. X
  444. Xint Algval[] = { 0, 3, 31, 59, 87, 115, 143, 171, 199, 227, 255 };
  445. X
  446. Xd5algin(d)
  447. X{
  448. X    int n = 0;
  449. X
  450. X    while ( d >= Algval[n] && n <= 10 )
  451. X        n++;
  452. X    return(n-1);
  453. X}
  454. X
  455. Xd5algout(v)
  456. X{
  457. X    return(Algval[v]);
  458. X}
  459. X
  460. Xd5vin(nparr,v)
  461. Xstruct numpair *nparr;
  462. X{
  463. X    int n;
  464. X
  465. X    for ( n=0; nparr[n].np_val >= 0; n++ ) {
  466. X        if ( v <= nparr[n].np_byte )
  467. X            return(n);
  468. X    }
  469. X    return(0);
  470. X}
  471. X
  472. Xchar *
  473. Xvisdcr(v)
  474. X{
  475. X    if ( v >= 0 && v< NUMCR ) {
  476. X        v = Chrate[v].np_val;
  477. X        sprintf(D5buff,"%d.%d",v/10,v%10);
  478. X        return(D5buff);
  479. X    }
  480. X    else
  481. X        return("??");
  482. X}
  483. X
  484. Xd5crout(v)
  485. X{
  486. X    if ( v >= 0 && v< NUMCR )
  487. X        return(Chrate[v].np_byte);
  488. X    else
  489. X        return(0);
  490. X}
  491. X
  492. Xchar *
  493. Xvisdcd(v)
  494. X{
  495. X    if ( v >= 0 && v< NUMCD ) {
  496. X        v = Chdepth[v].np_val;
  497. X        sprintf(D5buff,"%d.%d",v/10,v%10);
  498. X        return(D5buff);
  499. X    }
  500. X    else
  501. X        return("??");
  502. X}
  503. Xd5cdout(v)
  504. X{
  505. X    if ( v >= 0 && v< NUMCD )
  506. X        return(Chdepth[v].np_byte);
  507. X    else
  508. X        return(0);
  509. X}
  510. X
  511. X
  512. Xchar *
  513. Xvisdcf(v)
  514. X{
  515. X    if ( v >= 0 && v< 256 ) {
  516. X        v = Chfeed[v];
  517. X        sprintf(D5buff,"%d.%d",v/10,v%10);
  518. X        return(D5buff);
  519. X    }
  520. X    else
  521. X        return("??");
  522. X}
  523. X
  524. Xchar *
  525. Xvisd5no(v)
  526. X{
  527. X    char *p;
  528. X    switch (v) {
  529. X    case 0: p = "Normal"; break;
  530. X    case 1: p = "Pan B to A"; break;
  531. X    case 2: p = "Pan A to B"; break;
  532. X    }
  533. X    return(p);
  534. X}
  535. X
  536. Xchar *
  537. Xvisddo(v)
  538. X{
  539. X    char *p;
  540. X    switch (v) {
  541. X    case 0: p = "Normal"; break;
  542. X    case 1: p = "Invert Phase"; break;
  543. X    case 2: p = "Pan A to B"; break;
  544. X    }
  545. X    return(p);
  546. X}
  547. X
  548. Xchar *Revsel[] = { "Special 1", "Special 2", "Plate 1", "Plate 2",
  549. X  "Hall 14'","Hall 20'","Hall 27'","Hall 36'","Hall 48'","Hall 61'","Hall 76'",
  550. X  "Room 0.3'","Room 1.4'","Room 3.1'","Room 8.2'","Room 14'","Room 20'",
  551. X  "Room 27'","Room 36'","Room 48'","Room 61'","Room 76'"
  552. X};
  553. X
  554. Xchar *
  555. Xvisdrs(v)
  556. X{
  557. X    /* For algorithms 6,7,8,10, the reverb select parameter */
  558. X    /* is the NL output */
  559. X    if ( Alg==6 || Alg==7 || Alg==8 || Alg==10 )
  560. X        return(visd5no(v));
  561. X    if ( Alg == 9 )
  562. X        return(visddo(v));
  563. X    if ( v>=0 && v<22 ) {
  564. X        rtclip();
  565. X        return(Revsel[v]);
  566. X    }
  567. X    return("??");
  568. X}
  569. X
  570. Xchar *
  571. Xvisddt(v)
  572. X{
  573. X    int rem;
  574. X
  575. X    if ( v < 0 || v >= NUMDT )
  576. X        return("??");
  577. X    v = Dtime[v];
  578. X    if ( v < 1000 )
  579. X        sprintf(D5buff,"%d",v);
  580. X    else {
  581. X        rem = (v%1000)/10;
  582. X        sprintf(D5buff,(rem<10)?"%d.0%d":"%d.%d",v/1000,rem);
  583. X    }
  584. X    return(D5buff);
  585. X}
  586. X
  587. Xchar *
  588. Xvisd5pd(v)
  589. X{
  590. X    if ( v < 0 || v >= NUMPD )
  591. X        return("??");
  592. X    /* For algorithm 9 (aka 10), the predelay parameter is the delay time*/
  593. X    if ( Alg == 9 )
  594. X        return(visddt(v));
  595. X    else
  596. X        sprintf(D5buff,"%d",(int)Predly[v]);
  597. X    return(D5buff);
  598. X}
  599. X
  600. Xd5rtin(v)
  601. X{
  602. X    register int n;
  603. X
  604. X    if ( Alg==9 )
  605. X        return(v);
  606. X    else if ( Alg==6 || Alg==7 || Alg==8 || Alg==10 ) {
  607. X        for ( n=0; n<NUMNLRT; n++ ) {
  608. X            if ( v < Nlrevtime[n].np_byte )
  609. X                break;
  610. X        }
  611. X        return(n-1);
  612. X    }
  613. X    else {
  614. X        for ( n=0; n<NUMRT; n++ ) {
  615. X            if ( v < Revtime[n].np_byte )
  616. X                break;
  617. X        }
  618. X        return(n-1);
  619. X    }
  620. X}
  621. X
  622. Xd5rtout(v)
  623. X{
  624. X    if ( Alg==9 )
  625. X        return(v);
  626. X    else if ( Alg==6 || Alg==7 || Alg==8 || Alg==10 )
  627. X        return(Nlrevtime[v].np_byte);
  628. X    else
  629. X        return(Revtime[v].np_byte);
  630. X}
  631. X
  632. Xchar *
  633. Xvisd5rt(v)
  634. X{
  635. X    /* In algorithm 9 (aka 10), the reverb time parameter is */
  636. X    /* the delay feedback. */
  637. X    if ( Alg == 9 ) {
  638. X        if ( v<0 || v>=NUMCF )
  639. X            return("??");
  640. X        else
  641. X            return(visdcf(v));
  642. X    }
  643. X    else if ( Alg==6 || Alg==7 || Alg==8 || Alg == 10 ) {
  644. X        if ( v<0 || v>=NUMNLRT )
  645. X            return("??");
  646. X        v = Nlrevtime[v].np_val;
  647. X        if ( v < 0 )
  648. X            sprintf(D5buff,"-0.%d",-v);
  649. X        else if ( v < 10 )
  650. X            sprintf(D5buff,"0.%d",v);
  651. X        else if ( v < 100 )
  652. X            sprintf(D5buff,"%d.%d",v/10,v%10);
  653. X        else
  654. X            sprintf(D5buff,"%d",v/10);
  655. X        return(D5buff);
  656. X    }
  657. X    else if ( v >= 0 && v < NUMRT ) {
  658. X        v = rtclip();
  659. X        v = Revtime[v].np_val;
  660. X        if ( v < 100 )
  661. X            sprintf(D5buff,"%d.%d  ",v/10,v%10);
  662. X        else
  663. X            sprintf(D5buff,"%d  ",v/10);
  664. X        return(D5buff);
  665. X    }
  666. X    else
  667. X        return("??  ");
  668. X}
  669. X
  670. Xchar *
  671. Xvisd5gt(v)
  672. X{
  673. X    if ( v >=0 && v < NUMGATE ) {
  674. X        sprintf(D5buff,"%d",Gatetime[v]);
  675. X        return(D5buff);
  676. X    }
  677. X    else
  678. X        return("??");
  679. X}
  680. X
  681. X
  682. Xchar *
  683. Xvisd5hf(v)
  684. X{
  685. X    if ( Alg==6 || Alg==7 || Alg==8 || Alg==10 ) {
  686. X        return(visd5gt(v));
  687. X    }
  688. X    else if ( v >= 0 && v < NUMHF ) {
  689. X        v = Hf[v].hf_val;
  690. X        if ( v >= 10 )
  691. X            sprintf(D5buff,"%d.%d",v/100,v%100);
  692. X        else
  693. X            sprintf(D5buff,"0.0%d",v%100);
  694. X        return(D5buff);
  695. X    }
  696. X    else
  697. X        return("??");
  698. X}
  699. X
  700. Xd5hfout(v)
  701. X{
  702. X    if ( Alg==6 || Alg==7 || Alg==8 || Alg==10 )
  703. X        return(v);
  704. X    else
  705. X        return(Hf[v].hf_byte);
  706. X}
  707. X
  708. Xd5hfin(d)
  709. X{
  710. X    register int n;
  711. X
  712. X    if ( Alg==6 || Alg==7 || Alg==8 || Alg==10 )
  713. X        return(d);
  714. X    for ( n=0; Hf[n].hf_byte >= 0 ; n++ ) {
  715. X        if ( d < Hf[n].hf_byte )
  716. X            break;
  717. X    }
  718. X    return(n-1);
  719. X}
  720. X
  721. Xint Revmin[] = { 10,10,7,7,1,2,3,4,5,6,7,1,1,1,1,1,2,3,4,5,6,7 };
  722. Xint Revmax[] = { 990,990,990,990,200,400,720,990,990,990,990,
  723. X  5,15,35,75,200,400,720,990,990,990,990
  724. X};
  725. X
  726. Xrtclip()
  727. X{
  728. X    int rtval, rtype, origrtval;
  729. X
  730. X    origrtval = rtval = getval("reverbtime");
  731. X    rtype = getval("reverbsel");
  732. X    while ( Revtime[rtval].np_val < Revmin[rtype] )
  733. X        rtval++;
  734. X    while ( Revtime[rtval].np_val > Revmax[rtype] )
  735. X        rtval--;
  736. X    if ( rtval != origrtval ) {
  737. X        setval("reverbtime",rtval);
  738. X        showparam(parmindex("reverbtime"),0);
  739. X    }
  740. X    return(rtval);
  741. X}
  742. X
  743. X#define NUMBOOST 25
  744. Xstruct numpair Boost[] = {
  745. X0,-12, 11,-11, 21,-10, 31,-9, 41,-8,
  746. X52,-7, 62,-6, 72,-5, 82,-4, 92,-3,
  747. X103,-2, 113,-1, 123,0, 133,1, 143,2,
  748. X153,3, 164,4, 174,5, 184,6, 194,7,
  749. X204,8, 215,9, 225,10, 235,11, 245,12,
  750. X-1, -1
  751. X};
  752. X
  753. Xd5bcin(v)
  754. X{
  755. X    register int n;
  756. X
  757. X    for ( n=0; Boost[n].np_byte >= 0 ; n++ ) {
  758. X        if ( v < Boost[n].np_byte )
  759. X            break;
  760. X    }
  761. X    return(n-1);
  762. X}
  763. Xd5bcout(v)
  764. X{
  765. X    return(Boost[v].np_byte);
  766. X}
  767. X
  768. Xchar *
  769. Xvisd5bc(v)
  770. X{
  771. X    if ( v >= 0 && v < NUMBOOST ) {
  772. X        sprintf(D5buff,"%d",Boost[v].np_val);
  773. X        return(D5buff);
  774. X    }
  775. X    else
  776. X        return("??");
  777. X}
  778. X
  779. Xchar *
  780. Xvisd5q(v)
  781. X{
  782. X    if ( v==0 )
  783. X        return("0.2");
  784. X    else if ( v <= 3 )
  785. X        return("0.3");
  786. X    else if ( v <= 90 ) {
  787. X        sprintf(D5buff,"%d.%d",v/10,v%10);
  788. X        return(D5buff);
  789. X    }
  790. X    else
  791. X        return("??");
  792. X}
  793. X
  794. Xchar *
  795. Xvisd5fm(v)
  796. X{
  797. X    int rem;
  798. X
  799. X    if ( v < 0 || v > 127 )
  800. X        return("??");
  801. X    v = Freqmid[v];
  802. X    if ( v < 100 )
  803. X        sprintf(D5buff,"0.%d",v);
  804. X    else if ( v < 1000 ) {
  805. X        rem = v%100;
  806. X        sprintf(D5buff,(rem<10)?"%d.0%d":"%d.%d",v/100,rem);
  807. X    }
  808. X    else
  809. X        sprintf(D5buff,"%d.%d",v/100,(v/10)%10);
  810. X    return(D5buff);
  811. X}
  812. X
  813. Xinitdp5()
  814. X{
  815. X    static int initdone = 0;
  816. X    int n1, n2, n;
  817. X    FILE *f;
  818. X
  819. X    if ( initdone )
  820. X        return;
  821. X    initdone = 1;
  822. X    printf("Reading data from 'glibinit.dp5' ...\n");
  823. X
  824. X    Chdepth = (struct numpair *) alloc(NUMCD * sizeof(struct numpair));
  825. X    Chrate = (struct numpair *) alloc(NUMCR * sizeof(struct numpair));
  826. X    Chfeed = (int *) alloc(NUMCF * sizeof(int));
  827. X    Nlrevtime = (struct numpair *) alloc(NUMNLRT * sizeof(struct numpair));
  828. X    Revtime = (struct numpair *) alloc(NUMRT * sizeof(struct numpair));
  829. X    Freqmid = (int *) alloc(NUMFREQ * sizeof(int));
  830. X    Gatetime = (int *) alloc(NUMGATE * sizeof(int));
  831. X    Hf = (struct hfpair *) alloc(NUMHF * sizeof(struct hfpair));
  832. X    Dtime = (int *) alloc(NUMDT * sizeof(int));
  833. X    Predly = (int *) alloc(NUMPD * sizeof(int));
  834. X
  835. X    OPENTEXTFILE(f,"glibinit.dp5","r");
  836. X    if ( f == NULL ) {
  837. X        fprintf(stderr,"Hey, 'initdata.dp5' can't be opened!\n");
  838. X        millisleep(2000);
  839. X        return;
  840. X    }
  841. X
  842. X    if ( getcomment(f) )
  843. X        goto err;
  844. X    for ( n=0; n<NUMCD; n++ ) {
  845. X        if ( fscanf(f,"%d,%d",&n1,&n2) != 2 )
  846. X            goto err;
  847. X        Chdepth[n].np_byte = n1;
  848. X        Chdepth[n].np_val = n2;
  849. X    }
  850. X    if ( getcomment(f) )
  851. X        goto err;
  852. X    for ( n=0; n<NUMFREQ; n++ ) {
  853. X        if ( fscanf(f,"%d",&n1) != 1 )
  854. X            goto err;
  855. X        Freqmid[n] = n1;
  856. X    }
  857. X    if ( getcomment(f) )
  858. X        goto err;
  859. X    for ( n=0; n<NUMHF; n++ ) {
  860. X        if ( fscanf(f,"%d,%d",&n1,&n2) != 2 )
  861. X            goto err;
  862. X        Hf[n].hf_byte = n1;
  863. X        Hf[n].hf_val = n2;
  864. X    }
  865. X    if ( getcomment(f) )
  866. X        goto err;
  867. X    for ( n=0; n<NUMGATE; n++ ) {
  868. X        if ( fscanf(f,"%d",&n1) != 1 )
  869. X            goto err;
  870. X        Gatetime[n] = n1;
  871. X    }
  872. X    if ( getcomment(f) )
  873. X        goto err;
  874. X    for ( n=0; n<NUMCR; n++ ) {
  875. X        if ( fscanf(f,"%d,%d",&n1,&n2) != 2 )
  876. X            goto err;
  877. X        Chrate[n].np_byte = n1;
  878. X        Chrate[n].np_val = n2;
  879. X    }
  880. X    if ( getcomment(f) )
  881. X        goto err;
  882. X    for ( n=0; n<NUMNLRT; n++ ) {
  883. X        if ( fscanf(f,"%d,%d",&n1,&n2) != 2 )
  884. X            goto err;
  885. X        Nlrevtime[n].np_byte = n1;
  886. X        Nlrevtime[n].np_val = n2;
  887. X    }
  888. X    if ( getcomment(f) )
  889. X        goto err;
  890. X    for ( n=0; n<NUMCF; n++ ) {
  891. X        if ( fscanf(f,"%d",&n1) != 1 )
  892. X            goto err;
  893. X        Chfeed[n] = n1;
  894. X    }
  895. X    if ( getcomment(f) )
  896. X        goto err;
  897. X    for ( n=0; n<NUMRT; n++ ) {
  898. X        if ( fscanf(f,"%d,%d",&n1,&n2) != 2 )
  899. X            goto err;
  900. X        Revtime[n].np_byte = n1;
  901. X        Revtime[n].np_val = n2;
  902. X    }
  903. X    if ( getcomment(f) )
  904. X        goto err;
  905. X    for ( n=0; n<NUMDT; n++ ) {
  906. X        if ( fscanf(f,"%d",&n1) != 1 )
  907. X            goto err;
  908. X        Dtime[n] = n1;
  909. X    }
  910. X    if ( getcomment(f) )
  911. X        goto err;
  912. X    for ( n=0; n<NUMPD; n++ ) {
  913. X        if ( fscanf(f,"%d",&n1) != 1 )
  914. X            goto err;
  915. X        Predly[n] = n1;
  916. X    }
  917. X    if ( getcomment(f) )
  918. X        goto err;
  919. X
  920. X    return;
  921. X    err:
  922. X    fprintf(stderr,"Hey, something's wrong with initdata.dp5!\n");
  923. X    millisleep(2000);
  924. X    return;
  925. X}
  926. Xgetcomment(f)
  927. XFILE *f;
  928. X{
  929. X    char buff[BUFSIZ];
  930. X
  931. X    if ( fscanf(f,"%s",buff) != 1 || *buff != '#' )
  932. X        return(1);
  933. X    return(0);
  934. X}
  935. END_OF_FILE
  936. if test 18882 -ne `wc -c <'dep5.mnu'`; then
  937.     echo shar: \"'dep5.mnu'\" unpacked with wrong size!
  938. fi
  939. # end of 'dep5.mnu'
  940. fi
  941. if test -f 'mac-mdr.a' -a "${1}" != "-c" ; then 
  942.   echo shar: Will not clobber existing file \"'mac-mdr.a'\"
  943. else
  944. echo shar: Extracting \"'mac-mdr.a'\" \(14436 characters\)
  945. sed "s/^X//" >'mac-mdr.a' <<'END_OF_FILE'
  946. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  947. X; $Id: mac-mdr.a,v 1.6 89/05/06 17:13:33 lee Exp $
  948. X;
  949. X; midi driver
  950. X;
  951. X; also includes a millisecond relative-time counter with 5 mS resolution
  952. X;
  953. X; Steven A. Falco  - moss!saf
  954. X; 3/6/87
  955. X; $Log:    mac-mdr.a,v $
  956. X; Revision 1.6  89/05/06  17:13:33  lee
  957. X; rel. to comp.sources.misc
  958. X; 
  959. X;
  960. X; portions taken from article in nov 85 mactutor by Kirk Austin
  961. X;
  962. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  963. X;
  964. X        BRANCH    SHORT        ; use short displacements
  965. X        CASE    ON        ; be case-sensitive
  966. X        STRING    PASCAL        ; use pascal-style strings
  967. X;
  968. X; timer constants
  969. X;
  970. XTIME_INC    EQU    5        ; granularity of timer
  971. XMS5        EQU    3917        ; VIA tics per 5 ms (1.2766 uS each)
  972. X;
  973. XT1VEC        EQU    24        ; lvl1 trap table offset
  974. XMAX_BYTE    EQU    $FF        ; like it says
  975. XVIAT1EN        EQU    $C0        ; enable timer 1 interrupts
  976. XVIAT1DI        EQU    $40        ; diable timer 1  interrupts
  977. XVIARUN        EQU    $40        ; make T1 free-run
  978. XVIASTOP        EQU    $3F        ; put T1 in single-shot mode
  979. X;
  980. X; queue lengths
  981. X;
  982. XTxQSize        EQU    $100        ; transmit buffer length
  983. XRxQSize        EQU    $100        ; receive buffer length
  984. X;
  985. X; queue state flags
  986. X;
  987. Xmidi_em        EQU    $FF        ; queue is empty
  988. Xmidi_ne        EQU    $00        ; queue is not empty
  989. X;
  990. X; The following are stack offsets given that an item is passed
  991. X; by the MPW C compiler and LINK/UNLK is used. DANGER!!!  MPW C
  992. X; always passes in a long value.
  993. X;
  994. X; Note that in Pascal, a byte is passed as a short rather than a long...
  995. X; so Get_Byte would be $9.  Also, in C, the caller cleans up, while in
  996. X; Pascal the callee cleans up.
  997. X;
  998. XGet_Byte    EQU    $000B
  999. XGet_Short    EQU    $000A
  1000. XGet_Long    EQU    $0008
  1001. X;
  1002. X; select one based on oscillator frequency used in hardware
  1003. X;
  1004. X;C_baud        EQU    %01000100    ; 500 KHz
  1005. XC_baud        EQU    %10000100    ; 1 MHz
  1006. X;C_baud        EQU    %11000100    ; 2 MHz
  1007. X;
  1008. X; misc controls in SCC chip
  1009. X;
  1010. XNo_W_Req    EQU    0
  1011. XRx_off        EQU    %11000000
  1012. XTx_off        EQU    %01100010
  1013. XTRxC        EQU    %00101000
  1014. XBrgen_off    EQU    0
  1015. XRx_on        EQU    %11000001
  1016. XTx_on        EQU    %01101010
  1017. XDCD_int        EQU    %00001000
  1018. XRstExtSt    EQU    %00010000
  1019. XEnInt        EQU    %00010011
  1020. XMIntEn        EQU    %00001010
  1021. XEnMoInt        EQU    %00000001
  1022. XNo_Vec        EQU    %00000010
  1023. XaReset        EQU    %10000000
  1024. XrstTBE        EQU    $28
  1025. XrstEERR        EQU    $30
  1026. XNoData        EQU    $FFFF
  1027. X;
  1028. X; misc offsets in trap table
  1029. X;
  1030. XarxIO        EQU    24
  1031. XatxIO        EQU    16
  1032. XaspRC        EQU    28
  1033. X;
  1034. X; SR masks for interrupt control
  1035. X;
  1036. Xspl3        EQU    $0300        ;set interrupt level to 3
  1037. X;
  1038. X; SCC registers
  1039. X;
  1040. XSCC0        EQU    0
  1041. XSCC1        EQU    1
  1042. XSCC2        EQU    2
  1043. XSCC3        EQU    3
  1044. XSCC4        EQU    4
  1045. XSCC5        EQU    5
  1046. XSCC6        EQU    6
  1047. XSCC7        EQU    7
  1048. XSCC8        EQU    8
  1049. XSCC9        EQU    9
  1050. XSCC10        EQU    10
  1051. XSCC11        EQU    11
  1052. XSCC12        EQU    12
  1053. XSCC13        EQU    13
  1054. XSCC14        EQU    14
  1055. XSCC15        EQU    15
  1056. X;
  1057. X; macro to enqueue a byte to be transmitted (can't use a subroutine
  1058. X; 'cause we expect the stack to be in a certain state!)
  1059. X;
  1060. X        MACRO
  1061. X        TxEnqueue
  1062. X        MOVE    TxByteIn(A5),D0        ; where to put it (offset)
  1063. X        LEA    TxQueue(A5),A2        ; base of queue
  1064. X        MOVE.B    Get_Byte(A6),0(A2,D0)    ; copy it from the stack to the queue
  1065. X        ADDQ    #1,D0            ; bump offset
  1066. X        CMP    #TxQSize,D0        ; did it wrap?
  1067. X        BNE    @1            ; nope
  1068. X        MOVE    #0,D0            ; you betcha'
  1069. X@1        MOVE    D0,TxByteIn(A5)        ; replace it
  1070. X        ENDM
  1071. X;
  1072. X; macro for delay (SCC is slow compared to 68000)
  1073. X;
  1074. X        MACRO
  1075. X        Delay
  1076. X        MOVE.L    (SP),(SP)
  1077. X        ENDM
  1078. X;
  1079. X; macro to load an SCC register (double moves are on purpose - slow down)
  1080. X;
  1081. X        MACRO
  1082. X        Lscc    &sreg,&val
  1083. X        MOVE.B    &sreg,D0
  1084. X        MOVE.B    D0,(A0)
  1085. X        Delay
  1086. X        MOVE.B    &val,D0
  1087. X        MOVE.B    D0,(A0)
  1088. X        Delay
  1089. X        ENDM
  1090. X;
  1091. X; debug traps for Macsbug
  1092. X;
  1093. XDbgb        OPWORD    $A9FF        ; breakpoint
  1094. XDbgs        OPWORD    $ABFF        ; print string and breakpoint
  1095. X;
  1096. X; debug macro
  1097. X;
  1098. X        MACRO
  1099. X        Dbs    &string
  1100. X;        PEA    &string
  1101. X;        Dbgs
  1102. X        ENDM
  1103. X;
  1104. X; chip addresses and offsets
  1105. X;
  1106. X        PRINT    OFF
  1107. X        INCLUDE    'SysEqu.a'
  1108. X        PRINT    ON
  1109. X;
  1110. X; this code must always be resident so we load it in Main segment to
  1111. X; guarantee that.  (Ever call an interrupt handler that wasn't resident?)
  1112. X;
  1113. X        SEG    'Main'
  1114. X;
  1115. X; global area
  1116. X;
  1117. X        EXPORT (midi_txst, midi_rxst, midi_time):DATA
  1118. X;
  1119. XCtlOffset    DS.W    1            ; channel control offset
  1120. XDataOffset    DS.W    1            ; channel data offset
  1121. XChnReset    DS.B    1            ; SCC channel reset select
  1122. XRxIntOffset    DS.W    1            ; for dispatch table
  1123. XTxIntOffset    DS.W    1            ; likewise
  1124. XSpecRecCond    DS.W    1            ; and one more
  1125. X;
  1126. XTxQueue        DS.B    TxQSize            ; Tx data queue
  1127. Xmidi_txst    DS.B    1            ; the queue state
  1128. XTxByteIn    DS.W    1            ; offset for enqueue
  1129. XTxByteOut    DS.W    1            ; offset for dequeue
  1130. X;
  1131. XRxQueue        DS.B    RxQSize            ; and the Rx queue
  1132. Xmidi_rxst    DS.B    1            ; the queue state
  1133. XRxByteIn    DS.W    1            ; offset for enqueue
  1134. XRxByteOut    DS.W    1            ; offset for dequeue
  1135. X;
  1136. Xmidi_time    DS.L    1            ; mS relative-time value
  1137. Xold_via_v    DS.L    1            ; old VIA vector
  1138. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1139. X; The following are interrupt handlers.  The system saves registers
  1140. X; D0-D3 and A0-A3 so we don't...
  1141. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1142. X
  1143. X;
  1144. X; handler for time increment task
  1145. X;
  1146. Xup_it        PROC    ENTRY
  1147. X        MOVEM.L    A5,-(SP)        ; we also use D0-D1/A0
  1148. X        MOVE.L    CurrentA5,A5        ; we need the globals
  1149. X;        
  1150. X        Dbs    #'time interrupt'
  1151. X;    
  1152. X        MOVE.L    VIA,A0            ; via base register
  1153. X        MOVE.L    #vT1C,D0        ; low byte of counter
  1154. X        MOVE.B    0(A0,D0),D1        ; reading clears the interrupt
  1155. X;        
  1156. X        MOVEQ    #TIME_INC,D0        ; how much?
  1157. X        ADD.L    D0,midi_time(A5)    ; kick it up
  1158. X;        
  1159. X        MOVEM.L (SP)+,A5
  1160. X        RTS
  1161. X        ENDP
  1162. X;
  1163. X; interrupt handler for received characters
  1164. X;
  1165. XRxIntHand    PROC    ENTRY
  1166. X        MOVEM.L    A5,-(SP)        ; we also use D0-D1/A0-A2
  1167. X        MOVE.L    CurrentA5,A5        ; we need the globals
  1168. X        MOVE.L    SCCRd,A0        ; hardware addresses
  1169. X        MOVE.L    SCCWr,A1
  1170. X;
  1171. X        Dbs    #'rx interrupt'
  1172. X;
  1173. X        MOVE    DataOffset(A5),D0    ; ... offset
  1174. X        MOVE.B    0(A0,D0),D1        ; read the data - it's here given the interrupt
  1175. X        Delay
  1176. X        LEA    RxQueue(A5),A2        ; base of destination queue
  1177. X        MOVE    RxByteIn(A5),D0        ; ... offset
  1178. X        MOVE.B    D1,0(A2,D0)        ; store it
  1179. X        MOVE.B    #midi_ne,midi_rxst(A5)    ; guaranteed not empty
  1180. X        ADDQ    #1,D0            ; we filled one
  1181. X        CMP    #RxQSize,D0        ; wrapped it?
  1182. X        BNE    @1            ; not yet
  1183. X        MOVE    #0,D0            ; yes - reset to top
  1184. X;
  1185. X@1        MOVE    D0,RxByteIn(A5)        ; replace the offset
  1186. X;
  1187. X        MOVEM.L    (SP)+,A5        ; restore context
  1188. X        RTS                ; back to user
  1189. X        ENDP
  1190. X;
  1191. X; interrupt handler for transmitted characters
  1192. X;
  1193. XTxIntHand    PROC    ENTRY
  1194. X        MOVEM.L    A5,-(SP)        ; we also use D0-D1/A0-A2
  1195. X        MOVE.L    CurrentA5,A5
  1196. X        MOVE.L    SCCRd,A0        ; read base
  1197. X        MOVE.L    SCCWr,A1        ; write base
  1198. X;
  1199. X        Dbs    #'tx interrupt'
  1200. X;
  1201. X        TST.B    midi_txst(A5)        ; is there something to write?
  1202. X        BEQ    @1            ; no - pity
  1203. X        MOVE    CtlOffset(A5),D0    ; offset to control
  1204. X        MOVE.B    #rstTBE,0(A1,D0)    ; we saw the empty...
  1205. X        Delay
  1206. X        BRA    TxIExit            ; nothing to be done
  1207. X;
  1208. X@1        MOVE    TxByteOut(A5),D0    ; offset of something to send
  1209. X        LEA    TxQueue(A5),A2        ; base of queue
  1210. X        MOVE    DataOffset(A5),D1    ; offset to hardware
  1211. X        MOVE.B    0(A2,D0),0(A1,D1)    ; move it out
  1212. X        Delay
  1213. X        ADDQ    #1,D0            ; we used it up
  1214. X        CMP    #TxQSize,D0        ; wrapped?
  1215. X        BNE    @2            ; no...
  1216. X        MOVE    #0,D0            ; 'fraid so
  1217. X;
  1218. X@2        MOVE    D0,TxByteOut(A5)    ; remember position
  1219. X        MOVE    TxByteIn(A5),D1        ; see about the input side
  1220. X        CMP    D0,D1            ; now empty?
  1221. X        BNE    TxIExit            ; no - just exit
  1222. X        MOVE.B    #midi_em,midi_txst(A5)    ; it's empty
  1223. X;
  1224. XTxIExit
  1225. X        MOVEM.L    (SP)+,A5        ; be polite
  1226. X        RTS
  1227. X        ENDP
  1228. X;
  1229. X; a stub for special conditions - we sort-of handle them
  1230. X;
  1231. XStub        PROC    ENTRY
  1232. X        MOVEM.L    A5,-(SP)        ; we also use A0-A1
  1233. X        MOVE.L    CurrentA5,A5
  1234. X        MOVE.L    SCCRd,A0        ; read base
  1235. X        MOVE.L    SCCWr,A1        ; write base
  1236. X;
  1237. X        Dbs    #'stub interrupt'
  1238. X;
  1239. X        MOVE    CtlOffset(A5),D0    ; offset to control
  1240. X        MOVE.B    #rstEERR,0(A1,D0)    ; we saw the botch, clear it
  1241. X        Delay
  1242. X        MOVEM.L    (SP)+,A5
  1243. X        RTS
  1244. X        ENDP
  1245. X;
  1246. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1247. X; The following routines interface to MPW C.  It considers D0-D1/A0-A1 as
  1248. X; scratch.  So do we.  Returned values are placed in D0 (32 bits always)
  1249. X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1250. X;
  1251. X; init routine - must call this first to set up stuff!
  1252. X;
  1253. Xmidi_init    PROC    EXPORT
  1254. X        MOVE    #aCtl,CtlOffset(A5)
  1255. X        MOVE    #aData,DataOffset(A5)
  1256. X        MOVE.B    #aReset,ChnReset(A5)
  1257. X        MOVE    #arxIO,RxIntOffset(A5)
  1258. X        MOVE    #atxIO,TxIntOffset(A5)
  1259. X        MOVE    #aspRC,SpecRecCond(A5)
  1260. X;
  1261. X        MOVE    SR,-(SP)        ; save interrupts
  1262. X                        ; we use D0-D1/A0-A1
  1263. X        ORI    #spl3,SR        ; interrupts of 4 or better only        
  1264. X;
  1265. X        Dbs    #'init routine'
  1266. X;
  1267. X        MOVE.L    SCCRd,A1        ; get base address
  1268. X        ADD    CtlOffset(A5),A1    ; ... control
  1269. X        MOVE.B    (A1),D0            ; dummy read to clear SCC WR0
  1270. X        Delay
  1271. X;
  1272. X; set up SCC channel A
  1273. X;
  1274. X        MOVE.L    SCCWr,A0        ; another base address
  1275. X        ADD    CtlOffset(A5),A0    ; ... control
  1276. X        Lscc    #SCC9,ChnReset(A5)    ; reset channel
  1277. X        Lscc    #SCC4,#C_baud        ; set clock rate
  1278. X        Lscc    #SCC1,#No_W_Req        ; no write request
  1279. X        Lscc    #SCC3,#Rx_off        ; turn it off
  1280. X        Lscc    #SCC5,#Tx_off        ; him too
  1281. X        Lscc    #SCC9,#No_Vec        ; not vectored interrupts
  1282. X        Lscc    #SCC11,#TRxC        ; set clock source
  1283. X        Lscc    #SCC14,#Brgen_off    ; no break gen
  1284. X        Lscc    #SCC3,#Rx_on        ; now turn channel back on
  1285. X        Lscc    #SCC5,#Tx_on        ; these on too
  1286. X        Lscc    #SCC15,#DCD_int        ; Mr. Mousie on
  1287. X        Lscc    #SCC0,#RstExtSt        ; reset ext status
  1288. X        Lscc    #SCC0,#RstExtSt        ; reset ext status
  1289. X        Lscc    #SCC1,#EnInt        ; enable interrupts
  1290. X        Lscc    #SCC9,#MIntEn        ; master interrupt
  1291. X;
  1292. X; install trap vectors
  1293. X;
  1294. X        MOVE.L    #Lvl2DT,A0        ; dispatch table
  1295. X        MOVE    RxIntOffset(A5),D0    ; ... offset
  1296. X        LEA    RxIntHand,A1        ; pointer to handler
  1297. X        MOVE.L    A1,0(A0,D0)        ; load the pointer into the dispatch table
  1298. X        MOVE    TxIntOffset(A5),D0    ; ... offset
  1299. X        LEA    TxIntHand,A1        ; another pointer
  1300. X        MOVE.L    A1,0(A0,D0)        ; load it
  1301. X        MOVE    SpecRecCond(A5),D0    ; ... offset
  1302. X        LEA    Stub,A1            ; dummy handler
  1303. X        MOVE.L    A1,0(A0,D0)        ; load it
  1304. X;
  1305. X; clear queues
  1306. X;
  1307. X        CLR    RxByteIn(A5)        ; clear circ. buffer pointers
  1308. X        CLR    RxByteOut(A5)
  1309. X        MOVE.B    #midi_em,midi_rxst(A5)    ; mark it empty
  1310. X        CLR    TxByteIn(A5)
  1311. X        CLR    TxByteOut(A5)
  1312. X        MOVE.B    #midi_em,midi_txst(A5)    ; mark it empty
  1313. X;
  1314. X; get the timer going
  1315. X;
  1316. X        CLR.L    midi_time(A5)        ; start clean
  1317. X;
  1318. X;        save old interrupt vector - write ours
  1319. X        MOVE.L    #Lvl1DT,A0        ; via trap table base
  1320. X        MOVEQ    #T1VEC,D0        ; offset to t1 trap
  1321. X        MOVE.L    0(A0,D0),old_via_v(A5)    ; save the old one
  1322. X        LEA    up_it,A1        ; our trap handler
  1323. X        MOVE.L    A1,0(A0,D0)        ; set our handler in place
  1324. X;
  1325. X        MOVE.L    VIA,A0            ; via base register
  1326. X;
  1327. X;        set the mode of operation - free running
  1328. X        MOVE.L    #vACR,D0        ; offset to ACR
  1329. X        MOVE.B    0(A0,D0),D1        ; read old acr value
  1330. X        AND.B    #VIASTOP,D1        ; drop any existing T1 bits
  1331. X        OR.B    #VIARUN,D1        ; set the free-run bit
  1332. X        MOVE.B    D1,0(A0,D0)        ; put it back
  1333. X;
  1334. X;        set the latches and counters
  1335. X        MOVE.L    #vT1C,D0        ; low byte of timer
  1336. X        MOVE.B    #(MS5 ** MAX_BYTE),0(A0,D0) ; write low byte
  1337. X        MOVE.L    #vT1CH,D0        ; high byte of timer
  1338. X        MOVE.B    #((MS5 >> 8) ** MAX_BYTE),0(A0,D0) ; write high byte
  1339. X;
  1340. X        MOVE.L    #vIER,D0        ; enable/disable register
  1341. X        MOVE.B    #VIAT1EN,0(A0,D0)    ; enable that interrupt!
  1342. X;
  1343. X        MOVE    (SP)+,SR        ; interrupts on
  1344. X        RTS
  1345. X        ENDP
  1346. X;
  1347. X; midi_tx - send a byte to the midi port (we expect the stack to contain a long)
  1348. X;
  1349. Xmidi_tx        PROC    EXPORT
  1350. X        LINK    A6,#0            ; remember where our argument is
  1351. X        MOVE    SR,-(SP)        ; save interrupts
  1352. X        MOVEM.L    A2,-(SP)        ; we also use D0/A0-A1
  1353. X        ORI    #spl3,SR        ; interrupts of 4 or better only
  1354. X;
  1355. X        Dbs    #'transmit routine'
  1356. X;
  1357. X        TST.B    midi_txst(A5)        ; check the flag
  1358. X        BNE    TxQE            ; queue empty - send direct
  1359. X        ; something here - just add to queue
  1360. X        TxEnqueue
  1361. X        BRA    TxExit            ; go home    
  1362. X;
  1363. XTxQE        ; must write directly to device (maybe)
  1364. X        MOVE.L    SCCRd,A0        ; read base
  1365. X        MOVE.L    SCCWr,A1        ; write base
  1366. X        MOVE    CtlOffset(A5),D0    ; ... offset
  1367. X        BTST.B    #txBE,0(A0,D0)        ; is the device ready
  1368. X        BNE    FirstByte        ; yes - do direct write
  1369. X        ; device busy - add to queue - interrupt will wake up
  1370. X        ; handler and send it out when the device is free
  1371. X        TxEnqueue
  1372. X        MOVE.B    #midi_ne,midi_txst(A5)    ; now it's not empty
  1373. X        BRA    TxExit            ; done
  1374. X;
  1375. XFirstByte    ; it really wants this byte...
  1376. X        MOVE    DataOffset(A5),D0    ; ... offset
  1377. X        Delay
  1378. X        MOVE.B    Get_Byte(A6),0(A1,D0)    ; copy it from the stack to the device
  1379. X        Delay
  1380. X;
  1381. XTxExit        ; clean up the world
  1382. X        MOVEM.L    (SP)+,A2        ; restore registers
  1383. X        MOVE    (SP)+,SR        ; and interrupts
  1384. X        UNLK    A6
  1385. X        RTS                ; in C, the caller cleans up
  1386. X        ENDP
  1387. X;
  1388. X; midi_rx - get a byte from the port (leave it in D0 as a long)
  1389. X; We return -1 if nothing is available
  1390. X;
  1391. Xmidi_rx        PROC    EXPORT
  1392. X        ; don't need link 'cause nothing is passed in
  1393. X        MOVE    SR,-(SP)        ; save the interrupts
  1394. X        MOVEM.L    D2/A2,-(SP)        ; we also use D0-D1/A0-A1
  1395. X        ORI    #spl3,SR        ; interrupts of 4 or better only
  1396. X;
  1397. X        Dbs    #'receive routine'
  1398. X;
  1399. X        TST.B    midi_rxst(A5)        ; any data available?
  1400. X        BEQ    @1            ; yes
  1401. X        MOVE.W    #NoData,D0        ; no-data flag
  1402. X        EXT.L    D0            ; sign-extend it
  1403. X        BRA    RxExit            ; C returns stuff in D0
  1404. X;
  1405. X@1        MOVE    RxByteOut(A5),D2    ; ... offset
  1406. X        LEA    RxQueue(A5),A2        ; and base
  1407. X        CLR.L    D0            ; start off empty
  1408. X        MOVE.B    0(A2,D2),D0        ; get the byte
  1409. X        ADDQ    #1,D2            ; up the offset
  1410. X        CMP    #RxQSize,D2        ; wrapped around?
  1411. X        BNE    @2            ; not yet
  1412. X        MOVE    #0,D2            ; yes - reset it to the top
  1413. X;
  1414. X@2        MOVE    D2,RxByteOut(A5)    ; and save it
  1415. X        MOVE    RxByteIn(A5),D1        ; now look at the input side
  1416. X        CMP    D2,D1            ; is the queue now empty?
  1417. X        BNE    RxExit            ; no - don't worry about it
  1418. X        MOVE.B    #midi_em,midi_rxst(A5)    ; yes - set the flag
  1419. X;
  1420. XRxExit
  1421. X        MOVEM.L    (SP)+,D2/A2        ; restore registers
  1422. X        MOVE    (SP)+,SR        ; and interrupts
  1423. X        RTS
  1424. X        ENDP
  1425. X;
  1426. X; reset the modem port - must call before quitting because the trap
  1427. X; vectors will be invalid once we exit!!!
  1428. X;
  1429. Xmidi_reset    PROC    EXPORT
  1430. X        MOVE    #aCtl,CtlOffset(A5)    ; prepare globals
  1431. X        MOVE    #aData,DataOffset(A5)
  1432. X        MOVE.B    #aReset,ChnReset(A5)
  1433. X        MOVE    #arxIO,RxIntOffset(A5)
  1434. X        MOVE    #atxIO,TxIntOffset(A5)
  1435. X        MOVE    #aspRC,SpecRecCond(A5)
  1436. X;
  1437. X        MOVE    SR,-(SP)        ; save interrupts
  1438. X                        ; we use A0
  1439. X        ORI    #spl3,SR        ; interrupts of 4 or better only
  1440. X;
  1441. X        Dbs    #'reset routine'
  1442. X;
  1443. X        MOVE.L    SCCWr,A0        ; base for writing
  1444. X        ADD    CtlOffset(A5),A0    ; and the offset
  1445. X;
  1446. X        Lscc    #SCC9,ChnReset(A5)    ; reset channel
  1447. X        Lscc    #SCC15,#DCD_int        ; Mr. Mousie stays on
  1448. X        Lscc    #SCC0,#RstExtSt        ; reset ext status
  1449. X        Lscc    #SCC0,#RstExtSt        ; reset ext status
  1450. X        Lscc    #SCC1,#EnMoInt        ; enable mouse interrupts
  1451. X        Lscc    #SCC9,#MIntEn        ; master interrupt
  1452. X;
  1453. X; pull out the plug on the timer
  1454. X;
  1455. X;        first disable interrupts
  1456. X        MOVE.L    VIA,A0            ; base of via
  1457. X        MOVE.L    #vIER,D0        ; interrupt control reg.
  1458. X        MOVE.B    #VIAT1DI,0(A0,D0)    ; kill the interrupts
  1459. X;
  1460. X;        next set back to single shot mode
  1461. X        MOVE.L    #vACR,D0        ; offset to ACR
  1462. X        MOVE.B    0(A0,D0),D1        ; read old acr value
  1463. X        AND.B    #VIASTOP,D1        ; drop any existing T1 bits
  1464. X        MOVE.B    D1,0(A0,D0)        ; put it back
  1465. X;
  1466. X;        set the latches to 0
  1467. X        MOVE.L    #vT1C,D0        ; lower latch/counter
  1468. X        CLR.B    0(A0,D0)        ; clear it too
  1469. X        MOVE.L    #vT1CH,D0        ; offset to upper latch/counter
  1470. X        CLR.B    0(A0,D0)        ; clear it
  1471. X;
  1472. X;        restore old trap vector
  1473. X        MOVE.L    #Lvl1DT,A0        ; dispatch table
  1474. X        MOVEQ    #T1VEC,D0        ; vector offset
  1475. X        MOVE.L    old_via_v(A5),0(A0,D0)    ; reset the vector
  1476. X;
  1477. X; We don't turn the other vectors back to where they were...
  1478. X; We also don't leave any of our interrupts enabled so it's OK
  1479. X;
  1480. X        MOVE    (SP)+,SR        ; interrupts on
  1481. X        RTS
  1482. X        ENDP
  1483. X;
  1484. X        END
  1485. X
  1486. END_OF_FILE
  1487. if test 14436 -ne `wc -c <'mac-mdr.a'`; then
  1488.     echo shar: \"'mac-mdr.a'\" unpacked with wrong size!
  1489. fi
  1490. # end of 'mac-mdr.a'
  1491. fi
  1492. if test -f 'tx81p.mnu' -a "${1}" != "-c" ; then 
  1493.   echo shar: Will not clobber existing file \"'tx81p.mnu'\"
  1494. else
  1495. echo shar: Extracting \"'tx81p.mnu'\" \(14135 characters\)
  1496. sed "s/^X//" >'tx81p.mnu' <<'END_OF_FILE'
  1497. X/* $Id: tx81p.mnu,v 1.6 89/05/06 17:13:43 lee Exp $
  1498. X * GLIB - a Generic LIBrarian and editor for synths
  1499. X *
  1500. X * TX81Z routines for Performance parameters
  1501. X * Tim Thompson
  1502. X * modifications: Greg Lee
  1503. X * $Log:    tx81p.mnu,v $
  1504. X * Revision 1.6  89/05/06  17:13:43  lee
  1505. X * rel. to comp.sources.misc
  1506. X * 
  1507. X */
  1508. X
  1509. X#define OVERLAY1
  1510. X
  1511. X#include "glib.h"
  1512. X#include <ctype.h>
  1513. X
  1514. Xchar *visnum(), *viseffect(), *visass(), *viskey();
  1515. Xchar *vischan(), *visnote(), *vistdetune(), *vistout(), *vislfo();
  1516. Xchar *visponoff(), *vispvoice(), *vispshift();
  1517. X
  1518. Xstatic char Pbuff[17];
  1519. X
  1520. X#define PMEMSIZE 76
  1521. X#define PCEDSIZE 110
  1522. X
  1523. X#define RESERVESIZE 0
  1524. X
  1525. X/* This array contains arbitrary screen labels */
  1526. Xstruct labelinfo Ltx81p[] = {
  1527. X#MENU
  1528. X
  1529. X                  1      2      3      4      5      6      7      8
  1530. X                 ---    ---    ---    ---    ---    ---    ---    ---
  1531. X  Voice          %      %      %      %      %      %      %      %
  1532. X
  1533. X
  1534. X
  1535. X  Max Notes       %      %      %      %      %      %      %      %
  1536. X  Receive Ch.     %      %      %      %      %      %      %      %
  1537. X  Limit Low       %      %      %      %      %      %      %      %
  1538. X  Limit High      %      %      %      %      %      %      %      %
  1539. X  Detune          %      %      %      %      %      %      %      %
  1540. X  Note Shift      %      %      %      %      %      %      %      %
  1541. X  Volume          %      %      %      %      %      %      %      %
  1542. X  Out Assign      %      %      %      %      %      %      %      %
  1543. X  LFO Select      %      %      %      %      %      %      %      %
  1544. X  Micro Tune      %      %      %      %      %      %      %      %
  1545. X
  1546. X
  1547. X                                Micro Tune Table     %
  1548. X                                Micro Tune Key       %
  1549. X-------------------------+      Assign Mode          %
  1550. XAuto-Note: Pitch %       |      Effect Select        %
  1551. XVol %   Dur %   Chan %   |
  1552. X#END
  1553. X-1,-1,NULL
  1554. X};
  1555. X
  1556. Xstruct paraminfo  Ptx81p[] =  {
  1557. X/*
  1558. XNAME        TYPE    POS    MAX    OFFSET    MASK    SHIFT    ADHOC
  1559. X */
  1560. X#O op1voice    pvoice    %%    159    0
  1561. X#O op2voice    pvoice    %%    159    0
  1562. X#O op3voice    pvoice    %%    159    0
  1563. X#O op4voice    pvoice    %%    159    0
  1564. X#O op5voice    pvoice    %%    159    0
  1565. X#O op6voice    pvoice    %%    159    0
  1566. X#O op7voice    pvoice    %%    159    0
  1567. X#O op8voice    pvoice    %%    159    0
  1568. X#O op1max    num    %%    8    0
  1569. X#O op2max    num    %%    8    0
  1570. X#O op3max    num    %%    8    0
  1571. X#O op4max    num    %%    8    0
  1572. X#O op5max    num    %%    8    0
  1573. X#O op6max    num    %%    8    0
  1574. X#O op7max    num    %%    8    0
  1575. X#O op8max    num    %%    8    0
  1576. X#O op1rec    chan    %%    16    0
  1577. X#O op2rec    chan    %%    16    0
  1578. X#O op3rec    chan    %%    16    0
  1579. X#O op4rec    chan    %%    16    0
  1580. X#O op5rec    chan    %%    16    0
  1581. X#O op6rec    chan    %%    16    0
  1582. X#O op7rec    chan    %%    16    0
  1583. X#O op8rec    chan    %%    16    0
  1584. X#O op1liml    note    %%    127    0
  1585. X#O op2liml    note    %%    127    0
  1586. X#O op3liml    note    %%    127    0
  1587. X#O op4liml    note    %%    127    0
  1588. X#O op5liml    note    %%    127    0
  1589. X#O op6liml    note    %%    127    0
  1590. X#O op7liml    note    %%    127    0
  1591. X#O op8liml    note    %%    127    0
  1592. X#O op1limh    note    %%    127    0
  1593. X#O op2limh    note    %%    127    0
  1594. X#O op3limh    note    %%    127    0
  1595. X#O op4limh    note    %%    127    0
  1596. X#O op5limh    note    %%    127    0
  1597. X#O op6limh    note    %%    127    0
  1598. X#O op7limh    note    %%    127    0
  1599. X#O op8limh    note    %%    127    0
  1600. X#O op1detune    tdetune    %%    14    0
  1601. X#O op2detune    tdetune    %%    14    0
  1602. X#O op3detune    tdetune    %%    14    0
  1603. X#O op4detune    tdetune    %%    14    0
  1604. X#O op5detune    tdetune    %%    14    0
  1605. X#O op6detune    tdetune    %%    14    0
  1606. X#O op7detune    tdetune    %%    14    0
  1607. X#O op8detune    tdetune    %%    14    0
  1608. X#O op1shift    pshift    %%    48    0
  1609. X#O op2shift    pshift    %%    48    0
  1610. X#O op3shift    pshift    %%    48    0
  1611. X#O op4shift    pshift    %%    48    0
  1612. X#O op5shift    pshift    %%    48    0
  1613. X#O op6shift    pshift    %%    48    0
  1614. X#O op7shift    pshift    %%    48    0
  1615. X#O op8shift    pshift    %%    48    0
  1616. X#O op1vol    num    %%    99    0
  1617. X#O op2vol    num    %%    99    0
  1618. X#O op3vol    num    %%    99    0
  1619. X#O op4vol    num    %%    99    0
  1620. X#O op5vol    num    %%    99    0
  1621. X#O op6vol    num    %%    99    0
  1622. X#O op7vol    num    %%    99    0
  1623. X#O op8vol    num    %%    99    0
  1624. X#O op1out    tout    %%    3    0
  1625. X#O op2out    tout    %%    3    0
  1626. X#O op3out    tout    %%    3    0
  1627. X#O op4out    tout    %%    3    0
  1628. X#O op5out    tout    %%    3    0
  1629. X#O op6out    tout    %%    3    0
  1630. X#O op7out    tout    %%    3    0
  1631. X#O op8out    tout    %%    3    0
  1632. X#O op1lfo    lfo    %%    3    0
  1633. X#O op2lfo    lfo    %%    3    0
  1634. X#O op3lfo    lfo    %%    3    0
  1635. X#O op4lfo    lfo    %%    3    0
  1636. X#O op5lfo    lfo    %%    3    0
  1637. X#O op6lfo    lfo    %%    3    0
  1638. X#O op7lfo    lfo    %%    3    0
  1639. X#O op8lfo    lfo    %%    3    0
  1640. X#O op1micro    ponoff    %%    1    0
  1641. X#O op2micro    ponoff    %%    1    0
  1642. X#O op3micro    ponoff    %%    1    0
  1643. X#O op4micro    ponoff    %%    1    0
  1644. X#O op5micro    ponoff    %%    1    0
  1645. X#O op6micro    ponoff    %%    1    0
  1646. X#O op7micro    ponoff    %%    1    0
  1647. X#O op8micro    ponoff    %%    1    0
  1648. X#O microtune    num    %%    12    0
  1649. X#O microkey    key    %%    11    0
  1650. X#O assmode    ass    %%    1    0
  1651. X#O autopitch    num    %%    127    -60
  1652. X#O effect    effect    %%    3    0
  1653. X#O autochan    num    %%    16    -1    *5
  1654. X#O autodur    num    %%    20    -5    *5
  1655. X#O autovol    num    %%    127    -63
  1656. XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0
  1657. X};
  1658. X
  1659. X
  1660. Xchar *tx81voices[] = {
  1661. X    "GrandPiano", "Uprt piano", "Deep Grd", "HonkeyTonk", "Elec Grand",
  1662. X    "Fuzz Piano", "SkoolPiano", "Thump Pno", "LoTine81Z", "HiTine81Z",
  1663. X    "ElectroPno", "NewElectro", "DynomiteEP", "DynoWurlie", "Wood Piano",
  1664. X    "Reed Piano", "PercOrgan", "16 8 4 2 F", "PumpOrgan", "<6 Tease>",
  1665. X    "Farcheeza", "Small Pipe", "Big Church", "AnalogOrgn", "Thin Clav",
  1666. X    "EZ Clav", "Fuzz Clavi", "LiteHarpsi", "RichHarpsi", "Celeste",
  1667. X    "BriteCelst", "Squeezebox",
  1668. X
  1669. X    "Trumpet81Z", "Full Brass", "Flugelhorn", "ChorusBras", "FrenchHorn",
  1670. X    "AtackBrass", "SpitBoneBC", "Horns BC", "MelloTenor", "RaspAlto",
  1671. X    "Flute", "Pan Floot", "Bassoon", "Oboe", "Clarinet",
  1672. X    "Harmonica", "DoubleBass", "BowCello", "BoxCello", "SoloViolin",
  1673. X    "HiString 1", "LowString", "Pizzicato", "Harp", "ReverbStrg",
  1674. X    "SynString", "Voices", "HarmoPad", "FanfarTpts", "HiString 2",
  1675. X    "PercFlute", "BreathOrgn",
  1676. X
  1677. X    "NylonGuit", "Guitar #1", "TwelveStrg", "Funky Pick", "AllThatJaz",
  1678. X    "HeavyMetal", "Old Banjo", "Zither", "ElecBass 1", "SqncrBass",
  1679. X    "SynFunkBas", "ElecBass 2", "AnalogBass", "Jaco Bass", "LatelyBass",
  1680. X    "MonophBass", "StadiumSol", "TrumptSolo", "BCSexyPhon", "Lyrisyn",
  1681. X    "WarmSquare", "Sync Lead", "MellowSqar", "Jazz Flute", "HeavyLead",
  1682. X    "Java Jive", "Xylophone", "GreatVibes    ", "Sitar", "Bell Pad",
  1683. X    "PlasticHit", "DigiAnnie",
  1684. X
  1685. X    "BaadBreath", "VocalNuts", "KrstlChoir", "Metalimba", "WaterGlass",
  1686. X    "BowedBell", ">>WOW<<", "Fuzzy Koto", "Spc Midiot", "Gurgle",
  1687. X    "Hole in 1", "Birds", "MalibuNite", "Helicopter", "Flight Sim",
  1688. X    "Brthbells", "Storm Wind", "Alarm Call", "Racing Car", "Whistling",
  1689. X    "Space Talk", "Space Vibe", "Timpani", "FM Hi-Hats", "Bass Drum",
  1690. X    "Tube Bells", "Noise Shot", "Snare 1", "Snare 2", "Hand Drum",
  1691. X    "Synballs", "Efem Toms"
  1692. X};
  1693. X
  1694. X/*
  1695. X * tx8pdin
  1696. X *
  1697. X * Take info from 'data' and stuff values in the P array, by using
  1698. X * the setval (and setopval) functions.  The data is in PMEM format.
  1699. X */
  1700. X
  1701. Xtx8pdin(data)
  1702. Xchar *data;
  1703. X{
  1704. X    int dop, n, msb;
  1705. X
  1706. X    for ( n=1; n<=8; n++ ) {
  1707. X        dop = (n-1)*8;
  1708. X        setopval(n,"max",data[0+dop] & 017);
  1709. X        msb = (data[0+dop]>>4)&01;
  1710. X        setopval(n,"voice",128*msb + (data[1+dop]&0177));
  1711. X        setopval(n,"rec",data[2+dop] & 037);
  1712. X        setopval(n,"liml",data[3+dop] & 0177);
  1713. X        setopval(n,"limh",data[4+dop] & 0177);
  1714. X        setopval(n,"detune",data[5+dop] & 017);
  1715. X        setopval(n,"shift",data[6+dop] & 077);
  1716. X        setopval(n,"vol",data[7+dop] & 0177);
  1717. X        setopval(n,"out",(data[0+dop]>>5) & 03);
  1718. X        setopval(n,"lfo",(data[2+dop]>>5) & 03);
  1719. X        setopval(n,"micro",(data[6+dop]>>6) & 01);
  1720. X    }
  1721. X    setval("microtune",data[64] & 017);
  1722. X    setval("assmode",data[65] & 01);
  1723. X    setval("effect",(data[65]>>1) & 03);
  1724. X    setval("microkey",(data[65]>>3) & 017);
  1725. X
  1726. X    setval("autochan",Channel);
  1727. X}
  1728. X
  1729. X/*
  1730. X * tx8pdout
  1731. X *
  1732. X * Take (possibly changed) parameters values out of the P array and
  1733. X * put them back into 'data'.
  1734. X */
  1735. X
  1736. Xtx8pdout(data)
  1737. Xchar *data;
  1738. X{
  1739. X    int dop, n, voicenum, msb;
  1740. X
  1741. X    for ( n=1; n<=8; n++ ) {
  1742. X        dop = (n-1)*8;
  1743. X        voicenum = getopval(n,"voice");
  1744. X        msb = (voicenum>>7)&01;
  1745. X        data[0+dop] = getopval(n,"max") | (msb<<4)
  1746. X                | getopval(n,"out")<<5;
  1747. X        data[1+dop] = voicenum & 0177;
  1748. X        data[2+dop] = getopval(n,"lfo")<<5 | getopval(n,"rec");
  1749. X        data[3+dop] = getopval(n,"liml");
  1750. X        data[4+dop] = getopval(n,"limh");
  1751. X        data[5+dop] = getopval(n,"detune");
  1752. X        data[6+dop] = getopval(n,"micro")<<6 | getopval(n,"shift");
  1753. X        data[7+dop] = getopval(n,"vol");
  1754. X    }
  1755. X    data[64] = getval("microtune");
  1756. X    data[65] = getval("microkey")<<3 | getval("effect")<<1
  1757. X            | getval("assmode");
  1758. X    Channel = getval("autochan");
  1759. X}
  1760. X
  1761. Xtx8psedit(data)
  1762. Xchar *data;
  1763. X{
  1764. X    char pdata[PCEDSIZE];
  1765. X    int n, cksum, c;
  1766. X    char *p;
  1767. X
  1768. X    clrdata(pdata,PCEDSIZE);
  1769. X    pmemtopced(data,pdata);
  1770. X    sendmidi(0xf0);
  1771. X    sendmidi(0x43);
  1772. X    sendmidi(Channel-1);    /* channel # */
  1773. X    sendmidi(0x7e);        /* format type */
  1774. X    sendmidi(0x00);        /* byte count */
  1775. X    sendmidi(0x78);        /* byte count */
  1776. X    p = "LM  8976PE";
  1777. X    cksum = 0;
  1778. X    while ( (c=(int)(*p++)) != '\0' ) {
  1779. X        sendmidi(c);
  1780. X        cksum += c;
  1781. X    }
  1782. X    for ( n=0; n<PCEDSIZE; n++ ) {
  1783. X        c = (int)(pdata[n]);
  1784. X        sendmidi(c);
  1785. X        cksum += c;
  1786. X    }
  1787. X    sendmidi((-cksum) & 0x7f);
  1788. X    sendmidi(EOX);
  1789. X}
  1790. X
  1791. X/* Convert PMEM to PCED format */
  1792. Xpmemtopced(indata,outdata)
  1793. Xchar *indata, *outdata;
  1794. X{
  1795. X    int n, inop, outop;
  1796. X
  1797. X    for ( n=1; n<=8; n++ ) {
  1798. X        inop = (n-1)*8;
  1799. X        outop = (n-1)*12;
  1800. X
  1801. X        outdata[0+outop] = indata[0+inop] & 017;
  1802. X
  1803. X        outdata[1+outop] = (indata[0+inop]>>4)&01;
  1804. X        outdata[2+outop] = indata[1+inop] & 0177;
  1805. X        outdata[3+outop] = indata[2+inop] & 037;
  1806. X        outdata[4+outop] = indata[3+inop] & 0177;
  1807. X        outdata[5+outop] = indata[4+inop] & 0177;
  1808. X        outdata[6+outop] = indata[5+inop] & 017;
  1809. X        outdata[7+outop] = indata[6+inop] & 077;
  1810. X        outdata[8+outop] = indata[7+inop] & 0177;
  1811. X        outdata[9+outop] = (indata[0+inop]>>5) & 03;
  1812. X        outdata[10+outop] = (indata[2+inop]>>5) & 03;
  1813. X        outdata[11+outop] = (indata[6+inop]>>6) & 01;
  1814. X    }
  1815. X    outdata[96] = indata[64] & 017;
  1816. X    outdata[97] = indata[65] & 01;
  1817. X    outdata[98] = (indata[65]>>1) & 03;
  1818. X    outdata[99] = (indata[65]>>3) & 017;
  1819. X    for ( n=0; n<10; n++ )
  1820. X        outdata[100+n] = indata[66+n];
  1821. X}
  1822. X
  1823. X/* send a bulk performance dump to the tx81z */
  1824. Xtx8psbulk(data)
  1825. Xchar *data;
  1826. X{
  1827. X    int c, v, n, cksum;
  1828. X    char *p;
  1829. X
  1830. X    sendmidi(0xf0);
  1831. X    sendmidi(0x43);
  1832. X    sendmidi(Channel-1);    /* Channel # */
  1833. X    sendmidi(0x7e);
  1834. X    sendmidi(0x13);
  1835. X    sendmidi(0x0a);
  1836. X    p = "LM  8976PM";
  1837. X    cksum = 0;
  1838. X    while ( (c=(int)(*p++)) != '\0' ) {
  1839. X        sendmidi(c);
  1840. X        cksum += c;
  1841. X    }
  1842. X    /* send 32 PMEM's worth of data */
  1843. X    for ( v=0; v<32; v++ ) {
  1844. X        for ( n=0; n<PMEMSIZE; n++ ) {
  1845. X            /* 24 PMEM's are editable, but the bulk dump has 32 */
  1846. X            if ( v >= 24 )
  1847. X                c = 0;
  1848. X            else
  1849. X                c = VOICEBYTE(data,v,n);
  1850. X            sendmidi(c & 0xff);
  1851. X            cksum += c;
  1852. X        }
  1853. X    }
  1854. X    sendmidi((-cksum) & 0x7f);
  1855. X    sendmidi(0xf7);
  1856. X    return(0);
  1857. X}
  1858. X
  1859. X/* Request and read a bulk performance dump from the TX81Z */
  1860. Xtx8pgbulk(data)
  1861. Xchar *data;
  1862. X{
  1863. X    int c, n, v, b1, b2, cksum, ret = 1;
  1864. X    long begin, toolong;
  1865. X    char *p;
  1866. X
  1867. X    flushmidi();
  1868. X
  1869. X    sendmidi(0xf0);
  1870. X    sendmidi(0x43);
  1871. X    sendmidi(0x20 | (Channel-1));    /* Channel # */
  1872. X    sendmidi(0x7e);
  1873. X    p = "LM  8976PM";
  1874. X    while ( (c=(int)(*p++)) != '\0' )
  1875. X        sendmidi(c);
  1876. X    sendmidi(EOX);
  1877. X
  1878. X    begin = milliclock();
  1879. X    toolong = begin + 1000 * TIMEOUT;
  1880. X
  1881. X    if (synthinfileflag) getmidi();
  1882. X
  1883. X    /* wait for the x43 byte starting the dump */
  1884. X    while ( milliclock() < toolong ) {
  1885. X        if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x43 )
  1886. X            break;
  1887. X    }
  1888. X    if ( c != 0x43 ) {
  1889. X        Reason = "Timeout waiting for 0x43";
  1890. X        goto getout;
  1891. X    }
  1892. X    /* get the 14 bytes preceeding the data */
  1893. X    for ( cksum=n=0; n<14; n++ ) {
  1894. X        /* twiddle your thumbs, but not forever */
  1895. X        while ( ! STATMIDI ) {
  1896. X            if ( milliclock() > toolong )
  1897. X                goto timeout;    /* the end of an era */
  1898. X        }
  1899. X        c = getmidi();
  1900. X        if(n >= 4)
  1901. X            cksum += c; /* start of LM... keyword */
  1902. X    }
  1903. X    /* 32 memories are dumped */
  1904. X    for ( v=0; v<32; v++ ) {
  1905. X        for ( n=0; n<PMEMSIZE; n++ ) {
  1906. X            /* twiddle your thumbs, but not forever */
  1907. X            while ( ! STATMIDI ) {
  1908. X                if ( milliclock() > toolong )
  1909. X                    goto timeout;    /* the end of an era */
  1910. X            }
  1911. X            c = (getmidi() & 0xff);
  1912. X            /* Ignore non-data bytes ? */
  1913. X            if ( c & 0x80 )
  1914. X                continue;
  1915. X            /* compute checksum */
  1916. X            cksum += c;
  1917. X            /* Only 24 memories are used */
  1918. X            if ( v < 24 )
  1919. X                VOICEBYTE(data,v,n) = c;
  1920. X        }
  1921. X    }
  1922. Xtimeout:
  1923. X    if ( v < 32 ) {
  1924. X        Reason = "Timeout while reading!";
  1925. X        goto getout;
  1926. X    }
  1927. X    b1 = (getmidi() & 0xff);    /* Checksum */
  1928. X    b2 = (getmidi() & 0xff);    /* EOX */
  1929. X    cksum = (-cksum) & 0x7f;    /* convert to what we must match */
  1930. X    if ( b2 != EOX )
  1931. X        Reason = "EOX not received";
  1932. X    else if ( b1 != cksum ) {
  1933. X        static char ckbuff[80];
  1934. X        sprintf(ckbuff,"Checksum doesn't match (got %d expected %d)",b1,cksum);
  1935. X        /* Reason = "Checksum doesn't match"; */
  1936. X        Reason = ckbuff;
  1937. X    }
  1938. X    else {
  1939. X        Reason = "";
  1940. X        ret = 0;    /* all's well */
  1941. X    }
  1942. Xgetout:
  1943. X    return(ret);
  1944. X}
  1945. X
  1946. Xchar *
  1947. Xtx8pnof(data)
  1948. Xchar *data;
  1949. X{
  1950. X    int n;
  1951. X
  1952. X    for ( n=0; n<10; n++ )
  1953. X        Pbuff[n] = data[66+n];
  1954. X    Pbuff[10] = '\0';
  1955. X    return(Pbuff);
  1956. X} 
  1957. X
  1958. Xtx8psnof(data,name)
  1959. Xchar *data, *name;
  1960. X{
  1961. X    int n;
  1962. X
  1963. X    for ( n=0; name[n]!='\0' && n<10; n++ )
  1964. X        data[66+n] = name[n];
  1965. X    for ( ; n<10; n++ )
  1966. X        data[66+n] = ' ';
  1967. X} 
  1968. X
  1969. Xchar *
  1970. Xvisass(v)
  1971. X{
  1972. X    switch(v){
  1973. X    case 0: return("normal");
  1974. X    case 1: return("alternate");
  1975. X    }
  1976. X    return("");
  1977. X}
  1978. X
  1979. Xchar *
  1980. Xviskey(v)
  1981. X{
  1982. X    switch(v){
  1983. X    case 0: return("C");
  1984. X    case 1: return("C#");
  1985. X    case 2: return("D");
  1986. X    case 3: return("D#");
  1987. X    case 4: return("E");
  1988. X    case 5: return("F");
  1989. X    case 6: return("F#");
  1990. X    case 7: return("G");
  1991. X    case 8: return("G#");
  1992. X    case 9: return("A");
  1993. X    case 10: return("A#");
  1994. X    case 11: return("B");
  1995. X    }
  1996. X    return("");
  1997. X}
  1998. X
  1999. Xchar *
  2000. Xviseffect(v)
  2001. X{
  2002. X    switch(v){
  2003. X    case 0: return("none");
  2004. X    case 1: return("delay");
  2005. X    case 2: return("pan");
  2006. X    case 3: return("chord");
  2007. X    }
  2008. X    return("");
  2009. X}
  2010. X
  2011. Xchar *
  2012. Xvischan(v)
  2013. X{
  2014. X    if ( v >= 0 && v <= 15 ) {
  2015. X        sprintf(Pbuff,"%d",v+1);
  2016. X        return(Pbuff);
  2017. X    }
  2018. X    if ( v == 16 )
  2019. X        return("omni");
  2020. X    return("");
  2021. X}
  2022. X
  2023. Xchar *
  2024. Xvisnote(v)
  2025. X{
  2026. X    int octave;
  2027. X
  2028. X    octave = (v/12) - 2;
  2029. X    sprintf(Pbuff,"%s%d",viskey(v%12),octave);
  2030. X    return(Pbuff);
  2031. X}
  2032. X
  2033. Xchar *
  2034. Xvispshift(v)
  2035. X{
  2036. X    sprintf(Pbuff,"%d",v-24);
  2037. X    return(Pbuff);
  2038. X}
  2039. X
  2040. Xchar *
  2041. Xvistdetune(v)
  2042. X{
  2043. X    sprintf(Pbuff,"%d",v-7);
  2044. X    return(Pbuff);
  2045. X}
  2046. X
  2047. Xchar *
  2048. Xvistout(v)
  2049. X{
  2050. X    switch (v) {
  2051. X    case 0: return("off");
  2052. X    case 1: return("I");
  2053. X    case 2: return("II");
  2054. X    case 3: return("I+II");
  2055. X    }
  2056. X    return("");
  2057. X}
  2058. X
  2059. Xchar *
  2060. Xvislfo(v)
  2061. X{
  2062. X    switch (v) {
  2063. X    case 0: return("off");
  2064. X    case 1: return("inst1");
  2065. X    case 2: return("inst2");
  2066. X    case 3: return("vib");
  2067. X    }
  2068. X    return("");
  2069. X}
  2070. X
  2071. Xchar *
  2072. Xvisponoff(v)
  2073. X{
  2074. X    switch(v){
  2075. X    case 0: return("off");
  2076. X    case 1: return("on");
  2077. X    }
  2078. X    return("");
  2079. X}
  2080. X
  2081. Xchar *
  2082. Xvispvoice(v)
  2083. X{
  2084. X    char *p, *prefixes = "IABCD";
  2085. X    int bank, vnum, vindex;
  2086. X
  2087. X    bank = v/32;
  2088. X    vnum = (v%32) + 1;
  2089. X    sprintf(Pbuff,vnum<10?"%c0%d":"%c%d",prefixes[bank],vnum);
  2090. X    if ( bank > 0 ) {
  2091. X        vindex = (bank-1)*32+vnum-1;
  2092. X        if ( vindex >= 0 && vindex < 128 ) {
  2093. X            strcat(Pbuff,"~d~l~l~l");
  2094. X            p = tx81voices[vindex];
  2095. X            if ( strlen(p) <= 5 )
  2096. X                strcat(Pbuff,p);
  2097. X            else {
  2098. X                char buff[11];
  2099. X                strcpy(buff,p);
  2100. X                buff[5] = '\0';
  2101. X                strcat(Pbuff,buff);
  2102. X                strcat(Pbuff,"~d~l~l~l~l~l");
  2103. X                strcat(Pbuff,&p[5]);
  2104. X            }
  2105. X        }
  2106. X    }
  2107. X    return(Pbuff);
  2108. X}
  2109. END_OF_FILE
  2110. if test 14135 -ne `wc -c <'tx81p.mnu'`; then
  2111.     echo shar: \"'tx81p.mnu'\" unpacked with wrong size!
  2112. fi
  2113. # end of 'tx81p.mnu'
  2114. fi
  2115. echo shar: End of archive 8 \(of 15\).
  2116. cp /dev/null ark8isdone
  2117. MISSING=""
  2118. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2119.     if test ! -f ark${I}isdone ; then
  2120.     MISSING="${MISSING} ${I}"
  2121.     fi
  2122. done
  2123. if test "${MISSING}" = "" ; then
  2124.     echo You have unpacked all 15 archives.
  2125.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2126. else
  2127.     echo You still need to unpack the following archives:
  2128.     echo "        " ${MISSING}
  2129. fi
  2130. ##  End of shell archive.
  2131. exit 0
  2132.  
  2133.